8328
21604
Tato otázka již má odpovědi zde:
Žádný implicitní převod v přetíženém operátoru
(2 odpovědi)
Uzavřeno před 7 lety.
Píšu jednoduchý obal pro elementární typ a snažím se vyhnout nutnosti psát příliš mnoho chutí standardních operátorů. Doufal jsem, že implicitní převod typu pomůže, ale není tomu tak. Zde je rozebraný příklad:
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
Int operátor + (const Int & rhs) {návrat _i + rhs._i;}
};
int main (int argc, char * argv [])
{
(neplatné) (Int (1) + 2); // Pokuta
(neplatné) (2 + Int (1)); // chyba: neplatné operandy na binární výraz ('int' a 'Int')
}
Používám llvm. První řádek hlavních sestav je v pořádku. Druhý způsobí chybu. Doufal jsem, že se ve druhém řádku stane, že 2 bude implicitně převedeno na Int (2), následované voláním operator +. Proč se to neděje? Proč k implicitní konverzi dochází v prvním řádku? 
Stává se to v prvním řádku, protože jediný dostupný operátor + je operator + (Int &) (který má implicitní první parametr Int pro tuto instanci). Druhý řádek selže, protože první parametr je int a nemá tušení, že ho musí před pokusem o operaci převést (neví, že potřebuje použít Int :: operator +).
Tomuto problému se můžete vyhnout tím, že z operátora uděláte funkci nečlenského přítele (http://ideone.com/YCf7wX)
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
friend Int operator + (const Int & lhs, const Int & rhs);
};
Int operátor + (const Int & lhs, const Int & rhs)
{
vrátit lhs._i + rhs._i;
}
int main ()
{
Int i;
i + 5;
5 + i;
návrat 0;
}
|
Toto není odpověď, kterou hledáte? Projděte si další otázky se značkami implicitního převodu c ++ operátor-klíčové slovo nebo položte vlastní otázku.